﻿#include "FBaseButton.h"
#include <QStyle>
#include <QStyleOption>
#include <QPainter>
#include <QEvent>
#include <QMouseEvent>
#include <QDebug>


FBaseButton::FBaseButton(QWidget *parent)
    : FBaseButton("", parent)
{

}

FBaseButton::FBaseButton(const QString &text, QWidget *parent)
    : FBaseButton(QIcon(), text, parent)
{

}

FBaseButton::FBaseButton(const QIcon &icon, const QString &text, QWidget *parent)
    : QPushButton(parent)
    , m_colorType(FColors::Info)
    , m_sizeType(FTheme::Small)
    , m_appearanceType(Plain)
{
    setIcon(icon);
    setText(text);

    setCursor(Qt::PointingHandCursor);
    setFocusPolicy(Qt::NoFocus);
    updateStyle();
}

void FBaseButton::setColorType(FColors::FColorType type)
{
    if (m_colorType != type) {
        m_colorType = type;
        updateStyle();
    }
}

void FBaseButton::setAppearanceType(AppearanceType type)
{
    if (m_appearanceType != type) {
        m_appearanceType = type;
        updateStyle();
    }
}

void FBaseButton::setSizeType(FTheme::FSizeType type)
{
    if (m_sizeType != type) {
        m_sizeType = type;
        updateStyle();
    }
}

QList<QColor> FBaseButton::getColors()
{
    QList<QColor> res;

    QColor bc = FColors::getBaseColor(m_colorType);      // 基本色
    QColor dc = FColors::getDisabledColor(m_colorType);  // 禁用色
    QColor hc = FColors::getHoverColor(m_colorType);     // 悬停色
    QColor ac = FColors::getActiveColor(m_colorType);    // 激活色

    if (m_appearanceType == AppearanceType::Fill) {
        // 正常状态
        res.push_back(Qt::white);        // 文本颜色
        res.push_back(bc);               // 背景颜色
        res.push_back(bc);               // 边框颜色

        // 悬停状态
        res.push_back(Qt::white);        // 文本颜色
        res.push_back(hc);               // 背景颜色
        res.push_back(hc);               // 边框颜色

        // 按压状态
        res.push_back(Qt::white);        // 文本颜色
        res.push_back(ac);               // 背景颜色
        res.push_back(ac);               // 边框颜色

        // 禁用状态
        res.push_back(Qt::white);        // 文本颜色
        res.push_back(dc);               // 背景颜色
        res.push_back(dc);               // 边框颜色

    } else {
        // 正常状态
        res.push_back(bc);               // 文本颜色
        res.push_back(bc.lighter(170));  // 背景颜色
        res.push_back(bc);               // 边框颜色

        // 悬停状态
        res.push_back(Qt::white);        // 文本颜色
        res.push_back(bc);               // 背景颜色
        res.push_back(bc);               // 边框颜色

        // 按压状态
        res.push_back(Qt::white);        // 文本颜色
        res.push_back(ac);               // 背景颜色
        res.push_back(ac);               // 边框颜色

        // 禁用状态
        res.push_back(dc);               // 文本颜色
        res.push_back(bc.lighter(170));  // 背景颜色
        res.push_back(bc.lighter(150));  // 边框颜色
    }

    return res;
}

void FBaseButton::updateStyle()
{
    QString qss;
    QString fontSizeStyle;

    if (m_sizeType != FTheme::Normal) {  // 使用自定义文本大小
        fontSizeStyle = QString("font-size: %1px;").arg(static_cast<int>(m_sizeType));
    }
    if (m_colorType == FColors::Default) {  // 系统默认样式

        qss = QString(R"(
QPushButton {
    padding: 4px 20px 4px 20px;
    %1
}
)").arg(fontSizeStyle);

    } else {  // 自定义样式
        const auto& colors = getColors();
        qss = QString(R"(
QPushButton {
    padding: 4px 20px 4px 20px;
    border-radius: 4px;
    %1
    color: %2;
    background: %3;
    border: 1px solid %4;
}
QPushButton:hover {
    color: %5;
    background: %6;
    border: 1px solid %7;
}
QPushButton:pressed {
    color: %8;
    background: %9;
    border: 1px solid %10;
}
QPushButton:disabled {
    color: %11;
    background: %12;
    border: 1px solid %13;
}
)").arg(fontSizeStyle)
    .arg(colors[0].name(QColor::HexArgb), colors[1].name(QColor::HexArgb), colors[2].name(QColor::HexArgb),
         colors[3].name(QColor::HexArgb), colors[4].name(QColor::HexArgb), colors[5].name(QColor::HexArgb),
         colors[6].name(QColor::HexArgb), colors[7].name(QColor::HexArgb), colors[8].name(QColor::HexArgb))
    .arg(colors[9].name(QColor::HexArgb), colors[10].name(QColor::HexArgb), colors[11].name(QColor::HexArgb));

    }

    setStyleSheet(qss);
}
